//
//  ViewController.m
//  27-Block
//
//  Created by dllo on 16/8/19.
//  Copyright © 2016年 ZHW. All rights reserved.
//

#import "ViewController.h"
#import "SecondViewController.h"
@interface ViewController ()
@property (retain, nonatomic) IBOutlet UILabel *textLabel;
// Block写在属性中 修饰符使用copy
@property (nonatomic, copy) void (^myBlock)();
// Block写在方法中
- (void)handleData:(void (^)(void))handleData;
@end

@implementation ViewController

- (void)handleData:(void (^)(void))handleData{
    [[NSURLSession sharedSession] dataTaskWithRequest:[NSURLRequest new] completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
        handleData();
    }];
}

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    // 1 Block  消息传递机制之一
    // Block与函数相似, 有固定功能的代码段
    // 2 Block基本语法
    //  1> block声明
    // 类型 void (^)(void) 变量名 block
    // 返回值类型 (^XX)block名 (参数列表)
    void (^block)(void);
    //  2> block的赋值
    // block变量 = ^(参数列表) {固定的代码段};
    block = ^(void) {
        
    };
    
    // 3 Block的几种形式
    // 有参有返回值
    int (^sum)(int, int) = ^(int a, int b) {
        return a + b;
    };
    // 无参无返回
    void (^none)(void) = ^(void) {
        
    };
    // 无参无返回最简写法
    void (^block2)() = ^{
        self.view.backgroundColor = [UIColor yellowColor];
    };
    // 有参又返回
    void (^printfNumber)(int number) = ^(int number) {
        
    };
    // 无参有返回
    NSString *(^returnString)() = ^ {
      return @"返回";
    };
    // 系统提供了代码段可以直接使用, inlineBlock
//    <#returnType#>(^<#blockName#>)(<#parameterTypes#>) = ^(<#parameters#>) {
//        <#statements#>
//    };

    // 4 Block调用
    int result = sum(10, 20);
    NSLog(@"%d", result);
    block2();
    
    // 5 系统中的Block
    // 1> 模态 (void (^ __nullable)(void))
//    [self presentViewController:<#(nonnull UIViewController *)#> animated:<#(BOOL)#> completion:^{
//    }];
    // 2> GCD void (^dispatch_block_t)(void)
    dispatch_async(dispatch_get_main_queue(), ^{
        
    });
    // 3> 网络请求
    // void (^)(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error)
    [[NSURLSession sharedSession] dataTaskWithRequest:[NSURLRequest new] completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
        
    }];
    
    // 6 Block写在属性和方法中
    // 带block的方法的调用
    [self handleData:^{
        
    }];
    
    // 7 类型修饰符
    // __block __weak __strong
//    int __block a = 0;
//    //  1> __block 在ARC和MRC下有区别
//    // 可以在block内修改外部变量 (ARC和MRC下都可以)
//    // ARC下不能避免循环引用的问题, MRC能避免
//    void (^blockTest)() = ^{
//        a = 100;
//    };
    
    __block int a = 0;
    void (^blockTest)() = ^{
        a = 100;
    };
    
    //  2> __weak(弱引用) 修饰Block外的变量 (只能在ARC下使用, 避免Block的循环引用)
    
    //  3> __strong 强引用
}

- (IBAction)pushNextVC:(id)sender {
    SecondViewController *secondVC = [[SecondViewController alloc] init];
//    // 告诉Block 该指针弱引用
//    SecondViewController * __weak weakSecondVC = secondVC;
    // MRC
    SecondViewController *__block weakSecondVC = secondVC;
    
  
    // 值传递 需要实现Block
    secondVC.passTitle = ^(NSString *title) {
        // Block会对其内部的所有对象进行强引用
        self.textLabel.text = title;
        weakSecondVC.view.backgroundColor = [UIColor redColor];
    };
    [self.navigationController pushViewController:secondVC animated:YES];
    [secondVC release];

}


- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}


@end
